﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using AgileSaude.Entities;
using AgileSaude.Business;
using System.Reflection;

namespace AgileSaude.Web.Clinica
{
    public partial class Validacao : PageBase
    {
        public PedidoEntities Pedido
        {
            get { return (PedidoEntities)ViewState["pedido"]; }
            set { ViewState["pedido"] = value; }
        }

        private string sortExpression
        {
            get { return ViewState["sortExpression"].ToString(); }
            set { ViewState["sortExpression"] = value; }
        }

        private int sortDirection
        {
            get { return Convert.ToInt32(ViewState["sortDirection"]); }
            set { ViewState["sortDirection"] = value; }
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                this.sortExpression = "ServicoDescricao";
                this.sortDirection = 1;
            }
        }

        protected void btnConsultar_Click(object sender, EventArgs e)
        {
            try
            {
                btnConfirmar.Visible = false;
                if (txtVoucher.Text != "")
                    PreencheGrid();
            }
            catch (Exception ex)
            {
                ((Label)Master.FindControl("lblMensagem")).Text = ex.Message;
                ((Label)Master.FindControl("lblMensagem")).CssClass = "failureNotification";
                ((Label)Master.FindControl("lblMensagem")).Visible = true;
            }
        }

        protected void btnConfirmar_Click(object sender, EventArgs e)
        {
            try
            {
                Resultado result = new Resultado();

                if (Pedido != null)
                {
                    PedidoEntities ped = Pedido;
                    ped.DataAtendimento = DateTime.Now;
                    ped.idUsuarioValidacao = getUsuarioLogado().idUsuario;

                    result = new PedidoFacade().Alterar(ped);

                    ScriptManager.RegisterStartupScript(Page, Page.GetType(), "msg", @"alert('Consulta/Exame confirmado com sucesso!'); location.href='Validacao.aspx';", true);
                }
            }
            catch (Exception ex)
            {
                ((Label)Master.FindControl("lblMensagem")).Text = ex.Message;
                ((Label)Master.FindControl("lblMensagem")).CssClass = "failureNotification";
                ((Label)Master.FindControl("lblMensagem")).Visible = true;
            }
        }

        protected void gvServicos_Sorting(object sender, GridViewSortEventArgs e)
        {
            if (sortExpression != e.SortExpression)
                sortDirection = 1; //ASC
            else
                sortDirection *= -1; //DESC

            sortExpression = e.SortExpression;
            PreencheGrid();
        }

        protected void gvServicos_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            gvServicos.PageIndex = e.NewPageIndex;
            PreencheGrid();
        }

        private void PreencheGrid()
        {
            try
            {
                PedidoEntities pedido = new PedidoFacade().GetPedidoByVoucher(txtVoucher.Text);

                List<Pedido_ServicosEntities> lista = new List<Pedido_ServicosEntities>();

                if (pedido != null)
                {
                    if (!string.IsNullOrEmpty(pedido.PresenteNome))
                    {
                        lblCPF.Text = "Nome: " + pedido.PresenteNome;
                        lblNome.Text = "CPF: " + pedido.PresenteCPF;
                    }
                    else
                    {
                        lblCPF.Text = "Nome: " + pedido.Usuario.Nome;
                        lblNome.Text = "CPF: " + pedido.Usuario.CPF;
                    }

                    lblNome.Visible = true;
                    lblCPF.Visible = true;

                    //somente mostrar se for usuário administrador ou se for do mesmo medico
                    if (User.IsInRole("Administrador") || pedido.idMedico == getUsuarioLogado().idMedico)
                    {
                        if (pedido.idUsuarioValidacao != null || pedido.idUsuarioValidacao > 0)
                        {
                            ScriptManager.RegisterStartupScript(Page, Page.GetType(), "msg", @"alert('Consulta/Exame já foi confirmado!'); location.href='Validacao.aspx';", true);
                            return;
                        }

                        Pedido = pedido;
                        lista = pedido.Servicos;
                        btnConfirmar.Visible = true;
                    }
                }

                ((Label)Master.FindControl("lblMensagem")).Visible = false;
                OrdenarLista(ref lista);
                gvServicos.DataSource = lista;
                gvServicos.DataBind();
                gvServicos.Visible = true;

            }
            catch (Exception ex)
            {
                gvServicos.Visible = false;
                ((Label)Master.FindControl("lblMensagem")).Text = ex.Message;
                ((Label)Master.FindControl("lblMensagem")).CssClass = "failureNotification";
                ((Label)Master.FindControl("lblMensagem")).Visible = true;
            }
        }

        private void OrdenarLista(ref List<Pedido_ServicosEntities> lista)
        {
            lista.Sort(delegate(Pedido_ServicosEntities a1, Pedido_ServicosEntities a2)
            {
                Type t = typeof(Pedido_ServicosEntities);
                PropertyInfo prop = t.GetProperty(sortExpression);
                object u1Value = prop.GetValue(a1, null);
                object u2Value = prop.GetValue(a2, null);
                return ((IComparable)u1Value).CompareTo(((IComparable)u2Value)) * sortDirection;
            });
        }
    }
}